package demo.pattern.proxy.dynamic.jdk;

import demo.pattern.proxy.Payment;
import demo.pattern.proxy.ToBPayment;
import demo.pattern.proxy.ToCPayment;

public class Test {
	public static void main(String[] args) {
		/**
		 * 以下是方法返回值为object类型的测试方式，可以看到需要进行强转。
		 * 优点：newProxy方法传递的第一个参数，可以是接口类型，也可以是具体的实现类的类型
		 * 缺点：newProxy方法的返回值需要进行强转
		 */
		// 1、创建目标类
		Payment toBPayment = new ToBPayment();
		// 2、执行目标类方法的handler类
		PayInvocationHandler handler = new PayInvocationHandler(toBPayment);
		// 3、创建代理类
		Payment proxy = (Payment) ProxyUtils.newProxy(toBPayment, handler);
		// 4、执行被代理类方法
		proxy.pay();

		// 当需要复用该横切逻辑在其他的服务，如ToC服务时，不需要再像静态代理类一样再编写一个实现类
		ToCPayment toCPayment = new ToCPayment();//声明为具体实现类的类型
		handler = new PayInvocationHandler(toCPayment);
		Payment proxy1 = (Payment) ProxyUtils.newProxy(toCPayment, handler);
		proxy1.pay();

		/**
		 * 以下是方法返回值为泛型的测试方式，可以看到不需要进行类型强转
		 */
		Payment toBPayment1 = new ToBPayment();
//		ToBPayment toBPayment2 = new ToBPayment();//若不声明为接口类型，需要注意必须声明“调用createProxy的返回值”为接口类型
		handler = new PayInvocationHandler(toBPayment1);
		Payment proxy2 = ProxyUtils.createProxy(toBPayment1, handler);
		proxy2.pay();
	}
}
